package com.xzy.demo.juc;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author xzy
 * @date 2021/3/21 15:18
 * 说明：ArrayList线程不安全case
 * 1. 故障现象  java.util.ConcurrentModificationException
 * 2. 解决方案
 * 3. 导致原因
 * 4. 优化建议
 */
public class UnSafeDemo00 {
    public static void main(String[] args) {
        mapNoSafe();
    }

    private static void mapNoSafe() {
        /*
         * 2.解决方案
         *     2.1 Collections.synchronizedMap()
         *     2.2 ConcurrentHashMap
         */
        Map<String, String> map = new ConcurrentHashMap<>();

        // i<3 和 i<30，不同的现象
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 8));
                System.out.println(map);
            }, String.valueOf(i)).start();
        }
    }

    private static void setNoSafe() {
        /*
         * 2.解决方案
         *     2.1 Collections.synchronizedSet(new HashSet())
         *     2.2 CopyOnWriteArraySet()
         */
        Set<String> list = new HashSet<>();

        // i<3 和 i<30，不同的现象
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }

    private static void listNoSafe() {
        /*
         * 2.解决方案
         *     2.1 Vector
         *     2.2 Collections.synchronizedList(new ArrayList())
         *     2.3 CopyOnWriteArrayList()
         */
        List<String> list = new ArrayList<>();

        // i<3 和 i<30，不同的现象
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }
}
